<?php
// +----------------------------------------------------------------------
// | 授权系统 - 授权信息模型
// +----------------------------------------------------------------------
// | Author: AI Assistant
// +----------------------------------------------------------------------
declare (strict_types=1);

namespace common\models\system;

use Yii;
use yii\db\ActiveRecord;
use yii\behaviors\TimestampBehavior;

/**
 * 授权信息模型
 * 
 * @property int $id 授权ID
 * @property string $license_key 授权码
 * @property string $license_no 授权编号
 * @property int $customer_id 客户ID
 * @property int $product_id 产品ID
 * @property string $product_version 产品版本
 * @property int $license_type 授权类型
 * @property string $license_level 授权级别
 * @property string $domain 授权域名列表
 * @property string $ip_whitelist IP白名单
 * @property string $machine_code 机器码
 * @property string $features 功能权限列表
 * @property int $max_users 最大用户数
 * @property int $max_sites 最大站点数
 * @property int $allow_offline 是否允许离线验证
 * @property int $offline_days 离线验证天数
 * @property string $start_date 授权开始时间
 * @property string $end_date 授权结束时间
 * @property int $grace_days 宽限期天数
 * @property int $status 状态
 * @property int $online_validate_interval 在线验证间隔
 * @property string $last_validate_time 最后验证时间
 * @property string $last_validate_ip 最后验证IP
 * @property string $last_validate_domain 最后验证域名
 * @property int $validate_count 验证次数统计
 * @property string $encrypted_data 加密的授权数据
 * @property string $remark 备注
 * @property int $created_by 创建人ID
 * @property int $updated_by 更新人ID
 * @property string $created_at 创建时间
 * @property string $updated_at 更新时间
 */
class License extends ActiveRecord
{
    // 授权类型常量
    const TYPE_TRIAL = 1;      // 试用版
    const TYPE_OFFICIAL = 2;   // 正式版
    const TYPE_PERMANENT = 3;  // 永久版
    const TYPE_DEVELOPER = 4;  // 开发版

    // 授权级别常量
    const LEVEL_BASIC = 'basic';              // 基础版
    const LEVEL_PROFESSIONAL = 'professional'; // 专业版
    const LEVEL_ENTERPRISE = 'enterprise';     // 企业版

    // 状态常量
    const STATUS_NORMAL = 1;   // 正常
    const STATUS_EXPIRED = 2;  // 已过期
    const STATUS_DISABLED = 3; // 已禁用
    const STATUS_FROZEN = 4;   // 已冻结

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return '{{%sys_license}}';
    }

    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::class,
                'value' => date('Y-m-d H:i:s'),
            ],
        ];
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['customer_id', 'product_id'], 'required'],
            [['license_key'], 'required', 'on' => 'update'],
            [['customer_id', 'product_id', 'license_type', 'max_users', 'max_sites', 'allow_offline', 'offline_days', 'grace_days', 'status', 'online_validate_interval', 'validate_count', 'created_by', 'updated_by'], 'integer'],
            [['domain', 'ip_whitelist', 'features', 'encrypted_data', 'remark'], 'string'],
            [['start_date', 'end_date', 'last_validate_time', 'created_at', 'updated_at'], 'safe'],
            [['license_key'], 'string', 'max' => 255],
            [['license_no', 'product_version', 'license_level', 'machine_code', 'last_validate_ip', 'last_validate_domain'], 'string', 'max' => 255],
            [['license_key'], 'unique'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'license_key' => '授权码',
            'license_no' => '授权编号',
            'customer_id' => '客户ID',
            'product_id' => '产品ID',
            'product_version' => '产品版本',
            'license_type' => '授权类型',
            'license_level' => '授权级别',
            'domain' => '授权域名',
            'ip_whitelist' => 'IP白名单',
            'machine_code' => '机器码',
            'features' => '功能权限',
            'max_users' => '最大用户数',
            'max_sites' => '最大站点数',
            'allow_offline' => '允许离线',
            'offline_days' => '离线天数',
            'start_date' => '开始时间',
            'end_date' => '结束时间',
            'grace_days' => '宽限期',
            'status' => '状态',
            'validate_count' => '验证次数',
            'remark' => '备注',
            'created_at' => '创建时间',
            'updated_at' => '更新时间',
        ];
    }

    /**
     * 关联客户
     */
    public function getCustomer()
    {
        return $this->hasOne(Customer::class, ['id' => 'customer_id']);
    }

    /**
     * 关联产品
     */
    public function getProduct()
    {
        return $this->hasOne(Product::class, ['id' => 'product_id']);
    }

    /**
     * 获取授权类型文本
     */
    public function getLicenseTypeText()
    {
        $types = [
            self::TYPE_TRIAL => '试用版',
            self::TYPE_OFFICIAL => '正式版',
            self::TYPE_PERMANENT => '永久版',
            self::TYPE_DEVELOPER => '开发版',
        ];
        return $types[$this->license_type] ?? '未知';
    }

    /**
     * 获取状态文本
     */
    public function getStatusText()
    {
        $statuses = [
            self::STATUS_NORMAL => '正常',
            self::STATUS_EXPIRED => '已过期',
            self::STATUS_DISABLED => '已禁用',
            self::STATUS_FROZEN => '已冻结',
        ];
        return $statuses[$this->status] ?? '未知';
    }

    /**
     * 检查是否过期
     */
    public function isExpired()
    {
        if (empty($this->end_date)) {
            return false; // 永久授权
        }
        
        $endTime = strtotime($this->end_date);
        $graceTime = $endTime + ($this->grace_days * 86400);
        
        return time() > $graceTime;
    }

    /**
     * 获取剩余天数
     */
    public function getRemainingDays()
    {
        if (empty($this->end_date)) {
            return -1; // 永久授权
        }
        
        $endTime = strtotime($this->end_date);
        $remainingSeconds = $endTime - time();
        
        return max(0, ceil($remainingSeconds / 86400));
    }

    /**
     * 解析域名列表
     */
    public function getDomainList()
    {
        return $this->domain ? json_decode($this->domain, true) : [];
    }

    /**
     * 解析IP白名单
     */
    public function getIpWhiteList()
    {
        return $this->ip_whitelist ? json_decode($this->ip_whitelist, true) : [];
    }

    /**
     * 解析功能权限
     */
    public function getFeatureList()
    {
        return $this->features ? json_decode($this->features, true) : [];
    }

    /**
     * 检查域名是否在白名单中
     */
    public function isDomainAllowed($domain)
    {
        $allowedDomains = $this->getDomainList();
        if (empty($allowedDomains)) {
            return true; // 没有限制
        }
        
        foreach ($allowedDomains as $allowedDomain) {
            if ($this->matchDomain($domain, $allowedDomain)) {
                return true;
            }
        }
        
        return false;
    }

    /**
     * 匹配域名（支持通配符）
     */
    private function matchDomain($domain, $pattern)
    {
        $pattern = str_replace(['.', '*'], ['\.', '.*'], $pattern);
        return (bool)preg_match('/^' . $pattern . '$/i', $domain);
    }

    /**
     * 检查IP是否在白名单中
     */
    public function isIpAllowed($ip)
    {
        $allowedIps = $this->getIpWhiteList();
        if (empty($allowedIps)) {
            return true; // 没有限制
        }
        
        return in_array($ip, $allowedIps);
    }

    /**
     * 检查是否有某个功能权限
     */
    public function hasFeature($featureCode)
    {
        $features = $this->getFeatureList();
        if (empty($features)) {
            return true; // 没有限制，全部功能可用
        }
        
        return in_array($featureCode, $features);
    }

    /**
     * 更新验证信息
     */
    public function updateValidateInfo($ip, $domain)
    {
        $this->last_validate_time = date('Y-m-d H:i:s');
        $this->last_validate_ip = $ip;
        $this->last_validate_domain = $domain;
        $this->validate_count += 1;
        
        return $this->save(false);
    }
}

